; NASM 汇编编译器为 bin 文件格式提供了额外的操作符 org
; 它的功能是指定程序被载入内存时的起始地址
; 一句话，就是为程序中所有的内部地址引用增加一个段内偏移值
; 引导程序可以看做是被加载到以 0 为基址的段，偏移为 0x7c00
org 0x7c00

start:
    xor ax, ax		; xor 指令与 and or 指令类似，两个操作数的每一对对应位都应用如下操作原则：
					; 如果两个位的值相同（同为 0 或同为 1），则结果位等于 0；否则结果位等于 1
					; xor ax, ax 等于 ax = 0
	mov ss, ax		; 栈段 ss = 0
	mov ds, ax		; 数据段 ds = 0
	mov es, ax		; 附加数据段 es = 0 
	
	mov si, msg		; 将 msg 标签所表示的地址放到 si 寄存器中
	
print:
    mov al, [si]	; 取 si 所指向的内存单元中的值，然后赋值给 al
	add si, 1		; si = si +1
	cmp al, 0x00	; 判断 al 是否等于 0x00
	je last			; 如果等于，则跳转到 last 处，打印结束

	mov ah, 0x0e	; 程序执行到这里说明 al ≠ 0x00，继续打印 
					; 设置参数，ah 设置为 0x0e 作用是使 int 10 
					; 中断功能为在屏幕上打印一个字符，字符由 al 的值决定
	mov bx, 0x0f	; 设置参数，高 8 位 bh 设置页码，低 8 位 bl 设置属性
	int 0x10		; int 10 中断，由 BIOS 提供
	jmp print
	
last:
    hlt				; 处理器进入暂停状态，不执行任何操作
	jmp last		; 跳转到自己，就是死循环
	
msg:
	db "Welcome to KOS."		; 使用 db 定义数据
	times 510-($-$$) db 0x00 	; $ 表示程序当前位置
								; $$ 指代本 section 的起始地址
								; 如果没有定义 section ，nasm 默认全部代码同为一个 section ，起始地址为 0
								; 该指令表示将当前位置到 510 字节处全部填充数据 0x00
	db 0x55, 0xaa			 	; 主引导程序最后 2 个字节为 0x55, 0xaa

